package com.google.code.googlefight.fetch;

import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

/**
 * Hilfsklasse für die normale Suchseite von Google. Diese Klasse nutzt die
 * normale Suchseite und liest den Wert in "Ungefähr * Ergebnisse" aus. Es wird
 * JSoup zum Parsen des HTML verwendet.
 * 
 * @author Hans
 * 
 */
public class GoogleSearchImplDirect implements GoogleSearch {

	private static final String BASE_URL = "https://www.google.de/search";
	private static final String QUERY_PARAMETER = "q";

	private static final String HTTP_HEADER_VALUE_USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36";

	private static final String ELEMENT_ID = "resultStats";

	/**
	 * Pattern für Zahlen mit Punkt- und Komma-Trennung.
	 */
	private static final Pattern NUMBER_PATTERN = Pattern.compile("[0-9\\.,]+");

	/**
	 * Pattern für Punkte und Kommas zum Löschen dieser.
	 */
	private static final Pattern CLEAR_PATTERN = Pattern.compile("[\\.,]");

	public long getSearchResults(String query, Locale locale)
			throws GoogleSearchException {
		try {
			Document doc = Jsoup.connect(BASE_URL).data(QUERY_PARAMETER, query)
					.userAgent(HTTP_HEADER_VALUE_USER_AGENT).timeout(10000)
					.get();

			String resultStats = doc.getElementById(ELEMENT_ID).text();

			Matcher matcher = NUMBER_PATTERN.matcher(resultStats);
			if (matcher.find()) {
				return Long.parseLong(CLEAR_PATTERN.matcher(matcher.group())
						.replaceAll(""));
			} else {
				throw new GoogleSearchException("Cannot find the number.");
			}

		} catch (Exception e) {
			throw new GoogleSearchException(e);
		}
	}

}